import { decryptAES, encryptAES } from '@/utils/crypto'
import Cookies from 'js-cookie'

const isProduction = process.env.NODE_ENV === 'production'

// ------------------------------ localStorage ------------------------------
/**
 * 向 localStorage 中存数据
 * @param name 数据名称
 * @param value 数据值
 * @param isEncrypt 是否需要加密; 默认生产环境自动加密
 */
export function localSetItem<T = string>(name: string, value: T, isEncrypt = isProduction) {
  const str = JSON.stringify(value)
  if (isEncrypt) localStorage.setItem(name, encryptAES(str))
  else localStorage.setItem(name, str)
}

/**
 * 从 localStorage 中取数据
 * @param name 数据名称
 * @param isEncrypt 是否需要解密; 默认生产环境自动解密
 * @returns 取出的数据
 */
export function localGetItem<T = string>(name: string, isEncrypt = isProduction): T | null {
  const str = localStorage.getItem(name)
  if (str) {
    if (isEncrypt) return JSON.parse(decryptAES(str)) as T
    else return JSON.parse(str) as T
  }
  return null
}

/**
 * 从 localStorage 中删除数据
 * @param name 要移除的数据名称
 */
export const localRemoveItem = (name: string) => localStorage.removeItem(name)

/**
 * 清空 localStorage
 */
export const localClear = () => localStorage.clear()

// ------------------------------ sessionStorage ------------------------------
/**
 * 向 sessionStorage 中存数据
 * @param name 数据名称
 * @param value 数据值
 * @param isEncrypt 是否需要加密; 默认生产环境自动加密
 */
export function sessionSetItem<T = string>(name: string, value: T, isEncrypt = isProduction) {
  const str = JSON.stringify(value)
  if (isEncrypt) sessionStorage.setItem(name, encryptAES(str))
  else sessionStorage.setItem(name, str)
}

/**
 * 从 sessionStorage 中取数据
 * @param name 数据名称
 * @param isEncrypt 是否需要解密; 默认生产环境自动解密
 * @returns 取出的数据
 */
export function sessionGetItem<T = string>(name: string, isEncrypt = isProduction): T | null {
  const str = sessionStorage.getItem(name)
  if (str) {
    if (isEncrypt) return JSON.parse(decryptAES(str)) as T
    else return JSON.parse(str) as T
  }
  return null
}

/**
 * 从 sessionStorage 中删除数据
 * @param name 要移除的数据名称
 */
export const sessionRemoveItem = (name: string) => sessionStorage.removeItem(name)

/**
 * 清空 sessionStorage
 */
export const sessionClear = () => sessionStorage.clear()

// ------------------------------ cookie ------------------------------
/**
 * 向 cookie 中存数据
 * @param name 数据名称
 * @param value 数据值
 * @param opts cookie 配置项
 */
export function cookieSetItem<T = string>(name: string, value: T, opts?: Cookies.CookieAttributes) {
  const str = JSON.stringify(value)
  Cookies.set(name, str, opts)
  // const str = JSON.stringify(value)
  // document.cookie = `${name}=${encodeURIComponent(str)};path=/`
}

/**
 * 从 cookie 中取数据
 * @param name 数据名称
 * @returns 取出的数据
 */
export function cookieGetItem<T = string>(name: string): T | null {
  const value = Cookies.get(name)
  if (value) return JSON.parse(value) as T
  return null
  // const names = document.cookie?.split?.('; ') || []
  // const curTime = `${new Date().getTime()}`
  // for (let i = 0; i < names.length; i++) {
  //   const [key, value] = names[i].replace('=', curTime).split(curTime)
  //   if (key === name) {
  //     if (value) return JSON.parse(value) as T
  //     return null
  //   }
  // }
}

/**
 * 从 cookie 中删除数据
 * @param name 要移除的数据名称
 * @param opts cookie 配置项
 */
export const cookieRemoveItem = (name: string, opts?: Cookies.CookieAttributes) => {
  Cookies.remove(name, opts)
  // document.cookie = `${name}=0;expires=${new Date(0).toISOString()}`
}

/**
 * 清空 cookie
 */
export const cookieClear = () => {
  Object.entries(Cookies.get()).forEach(([key]) => {
    Cookies.remove(key)
  })
  // const names = document.cookie?.split?.('; ') || []
  // names.forEach((name) => {
  //   document.cookie = `${name}=0;expires=${new Date(0).toISOString()}`
  // })
}
